{"cells":[{"cell_type":"markdown","metadata":{"jupyter":{},"scrolled":false,"tags":[],"slideshow":{"slide_type":"slide"},"id":"83CE419F2111489993E63BA9A17A2710","runtime":{"status":"default","execution_status":null,"is_visible":false},"notebookId":"65251b1ab0f4556a3142003a"},"source":" # Lecture 5: Conjugate Families  \n \n ## Instructor: Dr. Hu Chuan-Peng  \n"},{"cell_type":"markdown","metadata":{"jupyter":{},"scrolled":false,"tags":[],"slideshow":{"slide_type":"slide"},"id":"F9D74954E247457C8BCCD7DB645F4502","runtime":{"status":"default","execution_status":null,"is_visible":false},"notebookId":"65251b1ab0f4556a3142003a"},"source":"## 回顾对先验的选择"},{"cell_type":"markdown","metadata":{"jupyter":{},"scrolled":false,"tags":[],"slideshow":{"slide_type":"slide"},"id":"8DC0D7793C8E407CBD7F9032896D6C0F","runtime":{"status":"default","execution_status":null,"is_visible":false},"notebookId":"65251b1ab0f4556a3142003a"},"source":"在lec3 与 lec4 中，我们使用了Beta分布来反映我们对参数$\\pi$的先验认识。  \n\n我们知道若先验可以用$Beta(\\alpha,\\beta)$描述，收集到的数据可以用$Bin(n, \\pi)$描述，后验分布就可以用$Beta(\\alpha+y, \\beta+n-y)$描述  \n\n在lec3中，我们介绍过共轭先验的概念(conjugate prior):  \n\n* 如果后验分布与先验分布属于同类，先验分布被称为似然函数的共轭先验  \n\n事实上，Beta-Binomial分布这类先验-数据组合，被称为共轭家族(conjugate family)，利用这些家族来获得后验，既有计算上的便利性，由于我们明确知道后验的分布类型，解释起来也很容易。"},{"cell_type":"markdown","metadata":{"jupyter":{},"scrolled":false,"tags":[],"slideshow":{"slide_type":"slide"},"id":"F207F3443B504C219F4AC7DADB819982","runtime":{"status":"default","execution_status":null,"is_visible":false},"notebookId":"65251b1ab0f4556a3142003a"},"source":"**非共轭先验会带来什么**  \n\n让我们再回到纣王支持率的例子，考虑一个非共轭先验的状况  \n\n假如此时的先验分布$f(\\pi)$不是$beta$分布，而是以下形式：  \n$$  \n\\begin{equation}  \nf(\\pi)=e-e^\\pi\\; \\text{ for } \\pi \\in [0,1].  \n\\tag{5.1}  \n\\end{equation}  \n$$  \n\n![](https://www.bayesrulesbook.com/bookdown_files/figure-html/non-conjugate-1.png)  \n"},{"cell_type":"markdown","metadata":{"jupyter":{},"scrolled":false,"tags":[],"slideshow":{"slide_type":"slide"},"id":"E3886F1CC1EE47DDBAAD2275CB4BCCDD","runtime":{"status":"default","execution_status":null,"is_visible":false},"notebookId":"65251b1ab0f4556a3142003a"},"source":"\n> 在有共轭先验$Beta(45,55)$的情况下，后验分布可以简洁地写为$Beta(75,75)$  \n> 但在非共轭先验的情况下，该后验分布的结果变得很繁琐。   \n> 并且在非共轭先验的情况下，我们很难从这个后验表达式中获得类似的直觉。   \n\n\n假设我们在50人的投票结果中观察到10人投了支持票，那么似然函数仍是一个二项分布，可以写成：  \n$$  \nL(\\pi | y=10) = \\left(\\!\\begin{array}{c} 50 \\\\ 10 \\end{array}\\!\\right) \\pi^{10} (1-\\pi)^{40} \\; \\; \\text{ for } \\pi \\in [0,1]  \n$$  \n\n后验可以写成：  \n$$  \nf(\\pi | y = 10) \\propto f(\\pi) L(\\pi | y = 10) = (e-e^\\pi) \\cdot \\binom{50}{10} \\pi^{10} (1-\\pi)^{40}.  \n$$  \n\n加入归一化常数后：  \n\n$$  \n\\begin{equation}  \nf(\\pi|y=10)= \\frac{(e-e^\\pi)  \\pi^{10} (1-\\pi)^{40}}{\\int_0^1(e-e^\\pi)  \\pi^{10} (1-\\pi)^{40}d\\pi}  \\; \\; \\text{ for } \\pi \\in [0,1].  \n\\tag{5.2}  \n\\end{equation}  \n$$"},{"cell_type":"markdown","metadata":{"jupyter":{},"scrolled":false,"tags":[],"slideshow":{"slide_type":"slide"},"id":"C10A1B47DB19447BB4F1402304B08E62","runtime":{"status":"default","execution_status":null,"is_visible":false},"notebookId":"65251b1ab0f4556a3142003a"},"source":"## Gamma-Poisson conjugate family"},{"cell_type":"markdown","metadata":{"jupyter":{},"scrolled":false,"tags":[],"slideshow":{"slide_type":"slide"},"id":"C27F7E9428AA4A7DAE1766A06BD73671","runtime":{"status":"default","execution_status":null,"is_visible":false},"notebookId":"65251b1ab0f4556a3142003a"},"source":"### The Poisson data model  \n\n**例子：亚运会中国每天获得金牌的数量**：🤔我们该使用哪种分布来描述下面这个例子？  \n\n假设一位体育爱好者每天都会查询中国在亚运会期间每天获得金牌的数量。  \n\n她觉得平均下来，中国每天会获得12枚金牌，并且这个数字大概在5-20之间波动  \n\n我们假设中国每天会获得金牌的**平均数量**设为$\\lambda$  \n> 请注意一些新的希腊字母：λ = lambda  \n\n<iframe src=\"https://tiyu.baidu.com/major/home/%E6%9D%AD%E5%B7%9E%E4%BA%9A%E8%BF%90%E4%BC%9A/tab/%E5%A5%96%E7%89%8C%E6%A6%9C\"></iframe>"},{"cell_type":"markdown","metadata":{"jupyter":{},"scrolled":false,"tags":[],"slideshow":{"slide_type":"slide"},"id":"47F86AF2B3DB44F7BDA59D64851ADE2C","runtime":{"status":"default","execution_status":null,"is_visible":false},"notebookId":"65251b1ab0f4556a3142003a"},"source":"**🤔我们该使用哪种分布来描述下面这个例子？**  \n\n需要注意的是，通常我们会：  \n1. 为$\\lambda$选择一个合适的先验  \n2. 接着收集数据，并且选择一个合适的数据模型  \n3. 结合先验与数据，更新我们对$\\lambda$的信念  \n\n在这一节中，为了方便探讨共轭先验，我们先从似然函数出发，然后再选取先验，最后讨论后验和共轭先验的关系。  \n- 我们需要先假定似然函数$L(\\lambda|y)$是已知的  \n- 再去选取一个合适的先验分布$p(\\lambda)$  \n- 最后使得后验分布与先验分布具有相同的数学形式。"},{"cell_type":"markdown","metadata":{"id":"797880D6806B41AF9C9042E2FDAEB8E7","notebookId":"65251b1ab0f4556a3142003a","runtime":{"status":"default","execution_status":null,"is_visible":false},"jupyter":{},"scrolled":false,"tags":[],"slideshow":{"slide_type":"slide"}},"source":"假设$\\lambda$是已知的，接下来我们对中国每天会获得金牌的数量$(Y_1,Y_2,\\ldots,Y_n)$进行估计  \n\n$$  \nf(Y_n|\\lambda)  \n$$  \n\n> * 注意，在这里，我们并不能使用二项模型来描述事件的分布情况  \n> * 在二项模型中，我们需要有事件重复的总次数n，和事件成功发生的概率p  \n>$$ f(y|\\pi) = P(Y=y | \\pi) = \\binom{n}{y} \\pi^y (1-\\pi)^{n-y}  $$  \n> * 在这里，我们已知的是$\\lambda$，即每天会获得金牌的平均数量"},{"cell_type":"markdown","metadata":{"jupyter":{},"scrolled":false,"tags":[],"slideshow":{"slide_type":"slide"},"id":"1BC0FF53004F41569EE381D24EF5BAFD","runtime":{"status":"default","execution_status":null,"is_visible":false},"notebookId":"65251b1ab0f4556a3142003a"},"source":"**Poisson分布**  \n\n\n我们可以使用 **泊松分布(Poisson distribution)** 来表示在给定$\\lambda$下，中国每天会获得金牌在不同数量下的概率  \n\n**Poisson分布**的概率质量函数(pmf)可以表示为：  \n\n$$  \nf(y) =  \\frac{\\lambda^{y}e^{-\\lambda}}{y!}  \n$$  \n\n* Poisson分布只有一个参数$\\lambda$，表示事情发生平均发生率(event rate)或事件发生的期望次数。  \n* y是数据，指在一定时间间隔中事件发生的次数。  \n* $f(y)$表示在某单位时间内，某事件y发生的平均次数的概率。  \n* 例如，已知中国每天平均会获得12枚金牌($\\lambda=12$), 那么中国队明天获得5枚金牌(y=5)的概率为 $f(y)=0.1$小于明天获得13枚金牌(y=13)的概率为 $f(y)=0.3$。  \n"},{"cell_type":"markdown","metadata":{"id":"C728D4D4AAAE43659E61C9A3FC148FD3","notebookId":"65251b1ab0f4556a3142003a","runtime":{"status":"default","execution_status":null,"is_visible":false},"jupyter":{},"scrolled":false,"tags":[],"slideshow":{"slide_type":"slide"}},"source":" poisson分布对数据做出的假设：  \n> * 事件发生比率($\\lambda$)是常数  \n> * 事件的发生是相互独立的  \n\n在这个例子中，中国每天会获得金牌的平均数量是固定的，并且前一天获得金牌的数量不会影响后一天获得金牌的数量"},{"cell_type":"markdown","metadata":{"jupyter":{},"scrolled":false,"tags":[],"slideshow":{"slide_type":"slide"},"id":"8FD26889C30C4D0DAEAF585B4D6324E4","runtime":{"status":"default","execution_status":null,"is_visible":false},"notebookId":"65251b1ab0f4556a3142003a"},"source":"**Poisson分布图示**  \n\n下图展示了不同$\\lambda$下，事件发生y次的可能性分布"},{"cell_type":"code","metadata":{"jupyter":{},"collapsed":false,"scrolled":false,"tags":[],"slideshow":{"slide_type":"skip"},"id":"407018403F2C4609BC76F35A85162502","notebookId":"65251b1ab0f4556a3142003a","trusted":true},"source":"# @title setup\nimport ipywidgets\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport scipy.stats as st\nfrom scipy.stats import gamma\nfrom ipywidgets import interact\nfrom matplotlib.lines import Line2D\nimport seaborn as sns\n","outputs":[],"execution_count":1},{"cell_type":"code","metadata":{"jupyter":{},"collapsed":false,"scrolled":false,"tags":[],"slideshow":{"slide_type":"fragment"},"trusted":true,"id":"5C0B2B6C5EDC4ACEA6B1B000E19D8941","notebookId":"65251b1ab0f4556a3142003a"},"source":"y = np.linspace(0, 25, 26)  # 假设明天获得金牌的平均数量 0到25次\nλ = 12                      # 假设每天平均获得12枚金牌\nst.poisson.pmf(y, λ)","outputs":[{"output_type":"display_data","data":{"text/plain":"<Figure size 640x480 with 1 Axes>","text/html":"<img src=\"\">"},"metadata":{}}],"execution_count":2},{"cell_type":"code","metadata":{"jupyter":{},"collapsed":false,"scrolled":false,"tags":[],"slideshow":{"slide_type":"slide"},"id":"A51E37A95B5345C6BA3F1A0A76D8CABF","notebookId":"65251b1ab0f4556a3142003a","trusted":true},"source":"y = np.linspace(0, 25, 26)        # 假设明天获得金牌的平均数量 0到25次\n\nλs = [5,10,15]                      # 生成三种每天获得枚金牌平均数量 lambda\n\nfig, axes = plt.subplots(1,3,figsize=(15,5),sharex=True,sharey=True)   # 生成三个子图\n\nfor i,λ in enumerate(λs):\n    y_p = st.poisson.pmf(y,λ)     # 在给定λ下，y发生的概率\n    axes[i].stem(y,y_p,           # 画图\n                 linefmt='black',\n                 bottom=-1)\n    axes[i].set_title(f\"poisson($\\lambda=${λ})\")  # 设置标题\n    axes[i].set_xlabel('$y$')                     # 设置x轴标题\n\n\naxes[0].set_ylabel('$f(y)$')                      # 设置y轴标题\nplt.ylim(0, 0.5)                                  # 设置y轴范围\nplt.yticks(np.arange(0, 0.5, 0.1))                # 设置y轴刻度\nsns.despine()","outputs":[{"output_type":"display_data","data":{"text/plain":"<Figure size 1500x500 with 3 Axes>","text/html":"<img src=\"https://cdn.kesci.com/upload/rt/3FAF373AE01F4B8EB9669C1ECEE11F14/s2326h5d7a.png\">"},"metadata":{}}],"execution_count":3},{"cell_type":"markdown","metadata":{"jupyter":{},"scrolled":false,"tags":[],"slideshow":{"slide_type":"slide"},"id":"E5F26085AD824826BB4C4B8BAD948C37","runtime":{"status":"default","execution_status":null,"is_visible":false},"notebookId":"65251b1ab0f4556a3142003a"},"source":"**计算Poisson的似然函数**  \n\n\n🤔如果我们一共获得了四天的数据，此时的似然函数怎么写？  \n\n我们将四天内中国获得的金牌数量$(Y_1, Y_2, \\ldots, Y_n)$组合为一个向量$\\vec{y} = (y_1,y_2,\\ldots,y_n)$  \n\n在给定的$\\lambda$下，$\\vec{y}$发生的可能性可以表示为：  \n\n$$  \nf(\\vec{y} | \\lambda) = \\prod_{i=1}^n f(y_i | \\lambda) = f(y_1 | \\lambda) \\cdot f(y_2 | \\lambda) \\cdot \\cdots \\cdot f(y_n | \\lambda)  \n$$  \n\n> 注意：由于每天获得金牌的数量是互不影响的，所以我们可以直接相乘：$P(A \\cap B) = P(A)P(B)$  \n"},{"cell_type":"markdown","metadata":{"id":"886B263892CC43189EA9B9B8405FF561","notebookId":"65251b1ab0f4556a3142003a","runtime":{"status":"default","execution_status":null,"is_visible":false},"jupyter":{},"scrolled":false,"tags":[],"slideshow":{"slide_type":"slide"}},"source":"我们可以把公式代入并进行整理，最后可得到  \n\n$$  \n\\begin{split}  \nf(\\vec{y} | \\lambda) =\\frac{\\lambda^{\\sum y_i}e^{-n\\lambda}}{\\prod_{i=1}^n y_i!} \\\\  \n\\end{split}  \n$$  \n\n其中n为数据的数量(在这个例子中是收集多少天的数据)，当n很大时，$\\prod y_i!$的计算将变得麻烦，同样的我们可以暂时忽略分母  \n\n$$  \nL(\\lambda | \\vec{y}) = \\frac{\\lambda^{\\sum y_i}e^{-n\\lambda}}{\\prod_{i=1}^n y_i!} \\propto \\lambda^{\\sum y_i}e^{-n\\lambda} \\;\\; \\text{ for } \\lambda > 0  \n$$"},{"cell_type":"markdown","metadata":{"id":"B0597CD0EE994B21AA75F1A53E5FDD87","notebookId":"65251b1ab0f4556a3142003a","runtime":{"status":"default","execution_status":null,"is_visible":false},"jupyter":{},"scrolled":false,"tags":[],"slideshow":{"slide_type":"slide"}},"source":"**具体计算**  \n\n$$  \n\\begin{split}  \nf(\\vec{y} | \\lambda)  \n& = \\frac{\\lambda^{y_1}e^{-\\lambda}}{y_1!} \\cdot \\frac{\\lambda^{y_2}e^{-\\lambda}}{y_2!} \\cdots \\frac{\\lambda^{y_n}e^{-\\lambda}}{y_n!} \\\\  \n& = \\frac{\\left[\\lambda^{y_1}\\lambda^{y_2} \\cdots \\lambda^{y_n}\\right] \\left[e^{-\\lambda}e^{-\\lambda} \\cdots e^{-\\lambda}\\right]}{y_1! y_2! \\cdots y_n!} \\\\  \n& =\\frac{\\lambda^{\\sum y_i}e^{-n\\lambda}}{\\prod_{i=1}^n y_i!} \\\\  \n\\end{split}  \n$$"},{"cell_type":"markdown","metadata":{"jupyter":{},"scrolled":false,"tags":[],"slideshow":{"slide_type":"slide"},"id":"140797C9D58143F28DF58E856EEF774B","runtime":{"status":"default","execution_status":null,"is_visible":false},"notebookId":"65251b1ab0f4556a3142003a"},"source":"**代入具体数据**  \n\n假设四天内中国获得金牌的数量分别是20，13，13，8，我们可以将其组合成一个向量$\\vec{y} = (y_1,y_2,y_3,y_4) = (20，13，13，8)$  \n\n代入公式：  \n$$  \nL(\\lambda | \\vec{y}) = \\frac{\\lambda^{\\sum y_i}e^{-n\\lambda}}{\\prod_{i=1}^n y_i!} \\;\\;\\;\\;\\;\\;\\;\\;\\;\\sum_{i=1}^4y_i = 20 + 13 + 13 + 8 = 54  \n$$  \n\n可得：  \n$$  \nL(\\lambda | \\vec{y}) = \\frac{\\lambda^{54}e^{-4\\lambda}}{20!\\times13!\\times13!\\times8!} \\propto \\lambda^{54}e^{-4\\lambda} \\;\\;\\;\\; \\text{ for } \\lambda > 0  \n$$  \n\n此时，输入不同的参数$\\lambda$，就可以计算得到对应参数的似然值。"},{"cell_type":"markdown","metadata":{"jupyter":{},"scrolled":false,"tags":[],"slideshow":{"slide_type":"slide"},"id":"ABDD78BB34B24D32BAFC931AA13BA557","runtime":{"status":"default","execution_status":null,"is_visible":false},"notebookId":"65251b1ab0f4556a3142003a"},"source":"首先，我们尝试绘制数据的频率分布图，以确定数据的形态。  \n\n其次，我们假设中国每天平均获得12枚金牌($\\lambda=12$)，并尝试计算对应数据的似然值。"},{"cell_type":"code","metadata":{"jupyter":{},"collapsed":false,"scrolled":false,"tags":[],"slideshow":{"slide_type":"fragment"},"trusted":true,"id":"F7DB7053FE674477B0909182E87E5D90","notebookId":"65251b1ab0f4556a3142003a"},"source":"# 绘制数据的分布\n\n#------------------------------------------------\n#                你可以更改以下数据，体会不同数据形成的分布，例如 observed_data = [3,3,2,2,2,1,...]\n#------------------------------------------------\nobserved_data = [20,13,13,8]   # 假设连续四天中国获得金牌的数量\n\nplt.hist(observed_data)\nplt.title('Histogram of Observations')\nplt.xlabel('Number of Gold Medal')\nplt.ylabel('Frequency')\nplt.show()","outputs":[{"output_type":"display_data","data":{"text/plain":"<Figure size 640x480 with 1 Axes>","text/html":"<img src=\"https://cdn.kesci.com/upload/rt/1E65914BB68140E4B7763D517C0DAB09/s23291dovs.png\">"},"metadata":{}}],"execution_count":17},{"cell_type":"code","metadata":{"jupyter":{},"collapsed":false,"scrolled":false,"tags":[],"slideshow":{"slide_type":"slide"},"id":"C1B5866FF6CD4EF68F8B20A52EC8A4CF","notebookId":"65251b1ab0f4556a3142003a","trusted":true},"source":"# 计算数据的似然 \n\n#------------------------------------------------\n#                你可以尝试不同的lambda 参数值\n#------------------------------------------------\nλ = 12 # 假设每天获得金牌的平均数量为12\n\nprint('The likelihood of observing the data given the parameter lambda is: ', st.poisson.pmf(observed_data,λ))","outputs":[{"output_type":"stream","name":"stdout","text":"The likelihood of observing the data given the parameter lambda is:  [0.00968203 0.10557038 0.10557038 0.06552328]\n"}],"execution_count":18},{"cell_type":"markdown","metadata":{"jupyter":{},"scrolled":false,"tags":[],"slideshow":{"slide_type":"slide"},"id":"CD0779EB0A424B799C38AB95E2D12CA4","runtime":{"status":"default","execution_status":null,"is_visible":false},"notebookId":"65251b1ab0f4556a3142003a"},"source":"**Poisson似然函数图示**  \n\n如何画出Poisson的似然函数图？  \n\n- 我们需要横轴为不同的$\\lambda$，纵轴为在不同的$\\lambda$下，$\\vec{y}$发生的似然$L(\\lambda | \\vec{y})$："},{"cell_type":"code","metadata":{"jupyter":{},"collapsed":false,"scrolled":false,"tags":[],"slideshow":{"slide_type":"fragment"},"trusted":true,"id":"20D5F657F7404D92AC4A2C3F94159BB1","notebookId":"65251b1ab0f4556a3142003a"},"source":"# 定义似然函数，由于该似然函数不能通过调用已有的函数获得，因此我们根据得到的公式定义一个\n\ndef poisson_likelihood(y):\n    lambdas = np.arange(0, 25, 0.1)\n    \n    # Calculate the Poisson likelihood for each lambda\n    likelihood_values = np.exp(-len(y) * lambdas) * np.power(lambdas, np.sum(y)) / np.prod([np.math.factorial(val) for val in y])\n\n    return lambdas, likelihood_values\n\n#传入需要的参数vec y\nobserved_data = [20,13,13,8]\nlambdas, likelihood_values = poisson_likelihood(observed_data)\nlikelihood_values /= np.sum(likelihood_values)\n\nplt.plot(lambdas, likelihood_values, color='black', lw=2)\nplt.xlabel('$\\lambda$')\nplt.ylabel('$L(\\lambda | Y=y)$')\nsns.despine()","outputs":[{"output_type":"display_data","data":{"text/plain":"<Figure size 640x480 with 1 Axes>","text/html":"<img src=\"https://cdn.kesci.com/upload/rt/8593B03A2A20436981E5AD8108C72BDB/s2326hee52.png\">"},"metadata":{}}],"execution_count":6},{"cell_type":"markdown","metadata":{"jupyter":{},"scrolled":false,"tags":[],"slideshow":{"slide_type":"slide"},"id":"9881119C9F2248488FB9EF7AC6D19F0D","runtime":{"status":"default","execution_status":null,"is_visible":false},"notebookId":"65251b1ab0f4556a3142003a"},"source":"###  Potential priors"},{"cell_type":"markdown","metadata":{"jupyter":{},"scrolled":false,"tags":[],"slideshow":{"slide_type":"slide"},"id":"A76CD1F5723B40A5A44788B3C2665F6A","runtime":{"status":"default","execution_status":null,"is_visible":false},"notebookId":"65251b1ab0f4556a3142003a"},"source":"**🤔思考：**  \n\n在之前的例子中，我们主要关注泊松分布相关的似然函数，而忽略了参数$\\lambda$的先验分布。  \n$$  \nL(\\lambda | \\vec{y}) = \\frac{\\lambda^{\\sum y_i}e^{-n\\lambda}}{\\prod_{i=1}^n y_i!} \\propto \\lambda^{11}e^{-4\\lambda}  \n$$  \n\n\n请根据公式的形态猜测一下，以下哪种先验分布可以作为poisson似然的共轭先验？？  \n\n1. Gamma模型：$f(\\lambda) \\propto \\lambda^{s - 1} e^{-r \\lambda}$  \n\n2. Weibull模型：$f(\\lambda) \\propto \\lambda^{s - 1} e^{(-r \\lambda)^s}$  \n\n3. \"F\"模型：$f(\\lambda) \\propto \\lambda^{\\frac{s}{2} - 1}\\left( 1 + \\lambda\\right)^{-s}$  \n\n"},{"cell_type":"markdown","metadata":{"jupyter":{},"scrolled":false,"tags":[],"slideshow":{"slide_type":"slide"},"id":"85CC3737FC894EC780887552897962E5","runtime":{"status":"default","execution_status":null,"is_visible":false},"notebookId":"65251b1ab0f4556a3142003a"},"source":"### Gamma prior"},{"cell_type":"markdown","metadata":{"jupyter":{},"scrolled":false,"tags":[],"slideshow":{"slide_type":"slide"},"id":"26F55FBE4B9F4B94A7CCDAD1756486BA","runtime":{"status":"default","execution_status":null,"is_visible":false},"notebookId":"65251b1ab0f4556a3142003a"},"source":"考虑到 $\\lambda$ 是一个可以取任何正值的连续变量。  \n\n我们可以使用Gamma分布对它进行模拟，以此作为$\\lambda$的先验分布。  \n\n$$  \n\\lambda \\sim \\text{Gamma}(s, r)  \n$$  \n\nGamma分布由两个参数指定：  \n- 形状参数（shape parameter）或称为尺度形状参数（scale shape parameter）, 一般用 s 或者 $\\alpha$ 表示。它是一个正实数，控制着Gamma分布的形状。较大的s值使得分布更加陡峭，而较小的s值使得分布更加平坦。  \n- 尺度参数（scale parameter）或称为逆尺度参数（inverse scale parameter），一般用 r 或者 $\\beta$ 表示。它也是一个正实数，控制着Gamma分布的尺度。较大的r值使得分布的尺度变大，而较小的r值使得分布的尺度变小。  \n\n\n![Image Name](https://cdn.kesci.com/upload/s233qulcqf.png?imageView2/0/w/640/h/640)  \n> source: https://www.mbbpxt.co/gamma%E5%88%86%E5%B8%83/  \n\n其pdf为：  \n\n$$  \nf(\\lambda) = \\frac{r^s}{\\Gamma(s)} \\lambda^{s-1} e^{-r\\lambda} \\;\\; \\text{ for } \\lambda > 0  \n$$"},{"cell_type":"code","metadata":{"jupyter":{},"collapsed":false,"scrolled":false,"tags":[],"slideshow":{"slide_type":"skip"},"id":"79192B773A5A4387B0AA9D6953C7195C","notebookId":"65251b1ab0f4556a3142003a","trusted":true},"source":"# @title interactive gamma\nimport ipywidgets\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport scipy.stats as st\nfrom scipy.stats import gamma\nfrom ipywidgets import interact\nimport seaborn as sns\n\n\nx = np.linspace(0, 20, 1000)\ndef plot_beta(a, b):\n    y = gamma.pdf(x, a=a, scale=1/b)\n    plt.plot(x, y, color='black', lw=2)\n    plt.title(f\"Gamma({a}, {b})\")\n    plt.xlabel('$\\lambda$')\n    plt.ylabel('$f(\\lambda)$')\n    plt.gca().yaxis.set_major_formatter('{x:1.1f}')\n    plt.xlim(0, 8)\n    plt.xticks(np.arange(0, 9, 2))\n    plt.yticks(np.arange(0, 2.5, 0.5))\n    sns.despine()","outputs":[],"execution_count":21},{"cell_type":"code","metadata":{"jupyter":{},"collapsed":false,"scrolled":false,"tags":[],"slideshow":{"slide_type":"fragment"},"id":"80BC5C759F9F4F61A629239310D9D513","notebookId":"65251b1ab0f4556a3142003a","trusted":true},"source":"ipywidgets.interact(plot_beta, a=(0, 10), b=(0, 10))","outputs":[{"output_type":"execute_result","data":{"text/plain":"<function __main__.plot_beta(a, b)>"},"metadata":{},"execution_count":23},{"output_type":"display_data","data":{"text/plain":"<Figure size 640x480 with 1 Axes>","text/html":"<img src=\"https://cdn.kesci.com/upload/rt/CEE649D338CB4EDCA5DB83BCB1779A35/s2335zcem6.png\">"},"metadata":{}}],"execution_count":23},{"cell_type":"markdown","metadata":{"jupyter":{},"scrolled":false,"tags":[],"slideshow":{"slide_type":"slide"},"id":"6A04DF616CBF4C868EB88BE2839482C3","runtime":{"status":"default","execution_status":null,"is_visible":false},"notebookId":"65251b1ab0f4556a3142003a"},"source":"已知$\\lambda$的平均值为12，我们选用$\\lambda \\sim \\text{Gamma}(24,2)$作为$\\lambda$的先验"},{"cell_type":"code","metadata":{"jupyter":{},"collapsed":false,"scrolled":false,"tags":[],"slideshow":{"slide_type":"fragment"},"trusted":true,"id":"CD10F35202054F248B87BC981787C3E1","notebookId":"65251b1ab0f4556a3142003a"},"source":"x = np.arange(0, 15, 0.1)\nprior_y = st.gamma.pdf(x, a=10, scale=1/2)\nplt.plot(x, prior_y, color='black', lw=2)\nplt.title(f\"Gamma(10,2)\")\nplt.xlabel('$\\lambda$')\nplt.ylabel('$f(\\lambda)$')\nplt.gca().yaxis.set_major_formatter('{x:1.1f}')\nplt.xticks(np.arange(0, 16, 5))\nplt.yticks(np.arange(0, 0.3, 0.1))\nsns.despine()","outputs":[{"output_type":"display_data","data":{"text/plain":"<Figure size 640x480 with 1 Axes>","text/html":"<img src=\"https://cdn.kesci.com/upload/rt/B5F73221BDD34C34906D231451626029/s2326io68d.png\">"},"metadata":{}}],"execution_count":10},{"cell_type":"markdown","metadata":{"jupyter":{},"scrolled":false,"tags":[],"slideshow":{"slide_type":"slide"},"id":"D4CB988ACF564E5A94E98B357E4B86A3","runtime":{"status":"default","execution_status":null,"is_visible":false},"notebookId":"65251b1ab0f4556a3142003a"},"source":"### Gamma-Poisson conjugacy  \n\n由于Gamma先验分布和Poisson似然来自一组共轭家族，既二者组成的后验分布同样也是Gamma分布，具有计算上的便利性，因此我们可以直接代入公式来计算后验：  \n\n- Gamma-Poisson 家族的公式表达：  \n\n$$\\begin{align*}  \n先验：& \\lambda \\sim \\text{Gamma}(s, r) \\\\  \n似然：& Y_i | \\lambda \\stackrel{ind}{\\sim} \\text{Pois}(\\lambda) \\\\  \n后验：& \\lambda|\\vec{y} \\; \\sim \\; \\text{Gamma}\\left(s + \\sum y_i, \\; r + n\\right)  \n\\end{align*}  \n$$  \n"},{"cell_type":"markdown","metadata":{"id":"476CF5036BCA469E8F9D20D2F732A83F","notebookId":"65251b1ab0f4556a3142003a","runtime":{"status":"default","execution_status":null,"is_visible":false},"jupyter":{},"scrolled":false,"tags":[],"slideshow":{"slide_type":"slide"}},"source":"**代入当前数据可得：**  \n\n> $先验：\\lambda \\sim \\text{Gamma}(24, 2)$  \n\n> $\\vec{y} = (y_1,y_2,y_3,y_4) = (20,13,13,8); \\;\\;\\;\\; $  \n\n> $似然：L(\\lambda | \\vec{y}) = \\frac{\\lambda^{54}e^{-48\\lambda}}{20!\\times13!\\times13!\\times8!} \\propto \\lambda^{54}e^{-48\\lambda}$  \n\n> $s + \\sum y_i = 24 + 54; \\;\\;\\;\\; r + n = 2 + 4 \\\\  \n后验：\\lambda|\\vec{y} \\; \\sim \\; \\text{Gamma}(78,6)$  \n\n\n我们可以将这三者画出来：  \n\n在收集了四天的数据后，我们对$\\lambda$的信念发生了更新，"},{"cell_type":"code","metadata":{"jupyter":{},"collapsed":false,"scrolled":false,"tags":[],"slideshow":{"slide_type":"slide"},"id":"9C407BB8A2E04C59B3470817B065ACC8","notebookId":"65251b1ab0f4556a3142003a","trusted":true},"source":"x = np.arange(0, 25, 0.1)\nprior_y = st.gamma.pdf(x, a=24, scale=1/2) / np.sum(st.gamma.pdf(x, a=24, scale=1/2))\nposterior = st.gamma.pdf(x, a=78, scale=1/6) / np.sum(st.gamma.pdf(x, a=78, scale=1/6))\n\nobserved_data = [20,13,13,8]\nlambdas, likelihood_values = poisson_likelihood(observed_data)\n\nlikelihood_values /= likelihood_values.sum()\n\nplt.plot(x, prior_y, color='black')\nplt.fill_between(x, prior_y, color=\"#f0e442\", alpha=0.5)\nplt.plot(lambdas, likelihood_values, color='black')\nplt.fill_between(lambdas, likelihood_values, color=\"#0071b2\", alpha=0.5)\nplt.plot(x, posterior, color='black')\nplt.xticks(np.arange(0, 16, 5))\nplt.fill_between(x, posterior, color=\"#009e74\", alpha=0.5)\n\n# 设置 x 和 y 轴标签\nplt.xlabel('$\\lambda$')\nplt.ylabel('density')\n\n# 创建自定义图例\ncustom_lines = [Line2D([], [], color=\"#f0e442\", lw=5),\n                Line2D([], [], color=\"#0071b2\", lw=5),\n                Line2D([], [], color=\"#009e74\", lw=5)]\n        \n# 将图例放置在子图外部的右上角\nplt.legend(custom_lines, ['prior', 'likelihood', 'posterior'], loc='upper right', bbox_to_anchor=(1, 1))\n\n# 移除图的上、右边框线\nsns.despine()","outputs":[{"output_type":"display_data","data":{"text/plain":"<Figure size 640x480 with 1 Axes>","text/html":"<img src=\"https://cdn.kesci.com/upload/rt/270707D794574D52A8D2C199C8A13EA0/s2326ijr57.png\">"},"metadata":{}}],"execution_count":11},{"cell_type":"markdown","metadata":{"jupyter":{},"scrolled":false,"tags":[],"slideshow":{"slide_type":"slide"},"id":"27D65062551E48A0A7A1A5814B31EFF4","runtime":{"status":"default","execution_status":null,"is_visible":false},"notebookId":"65251b1ab0f4556a3142003a"},"source":"**扩展**  \n\n除了 Gamma分布外，Poisson分布的共轭先验还包括 Negative Binomial分布:  \n\n$$  \n\\begin{align*}  \nGamma: & f(\\lambda) \\propto \\lambda^{s - 1} e^{-r \\lambda} \\\\  \nNegative-binomial: & P(X = k) = (k + r - 1) C (k) * p^k * (1 - p)^r  \n\\end{align*}  \n$$  \n\n然而，Weibull模型和\"F\"模型不是Poisson分布的共轭先验：  \n\n$$  \n\\begin{align*}  \nWeibull模型：& f(\\lambda) \\propto \\lambda^{s - 1} e^{(-r \\lambda)^s} \\\\  \nF模型：& f(\\lambda) \\propto \\lambda^{\\frac{s}{2} - 1}\\left( 1 + \\lambda\\right)^{-s}  \n\\end{align*}  \n$$"},{"cell_type":"markdown","metadata":{"jupyter":{},"scrolled":false,"tags":[],"slideshow":{"slide_type":"slide"},"id":"ADF44E0833C0467FA8D3231C53A1215F","runtime":{"status":"default","execution_status":null,"is_visible":false},"notebookId":"65251b1ab0f4556a3142003a"},"source":"## Normal-Normal conjugate family  \n\n我们已经学习了两个共轭族：Beta-Binomial 和 Gamma-Poisson。  \n\n但还有更多的共轭族存在！最常见的就是：Normal-Normal。  \n\n**来看一个经典的例子：身高分布**  \n\n国家卫健委：2020年我国18-44岁成年人平均身高为165厘米。随着生成质量的提高，我们有理由相信，这一数据有所提高，所以我们打算新收集一万名被试(n=10000)的身高数据，并使用正态-正态贝叶斯模型来估计**根据数据更新后**的平均身高。  \n\n![](https://th.bing.com/th/id/OIP.fdUphNKKkEvn9msoc8VRFwHaE8?pid=ImgDet&rs=1)  \n\n> source: https://baijiahao.baidu.com/s?id=1736757271631341254&wfr=spider&for=pc"},{"cell_type":"markdown","metadata":{"jupyter":{},"scrolled":false,"tags":[],"slideshow":{"slide_type":"slide"},"id":"1C79B769B2114BFBB0CF68BE057B0A63","runtime":{"status":"default","execution_status":null,"is_visible":false},"notebookId":"65251b1ab0f4556a3142003a"},"source":"### The Normal data model  \n\n同样，我们的贝叶斯分析也是从对平均身高(μ)的先验开始。  \n然而，要为μ指定一个适当的先验模型结构，需要考虑数据(Yi)的特征。  \n\n由于身高 Yi 是连续数据，因此有很多潜在可能的模型：贝塔模型、指数模型、伽马模型、正态分布模型、F 模型等。  \n- 从这个列表中，我们可以立即排除贝塔模型。因为它假设 Yi ∈ [0，1]，而身高往往在 165cm 左右。  \n- 在剩下的选项中，正态模型是相当合理的。这也是我们直觉上的第一反应，毕竟身高通常围绕某个总体平均值（μ）呈现为对称或正态分布。"},{"cell_type":"markdown","metadata":{"jupyter":{},"scrolled":false,"tags":[],"slideshow":{"slide_type":"slide"},"id":"2C205A057BF44432AEA99BEDBB6A1EB0","runtime":{"status":"default","execution_status":null,"is_visible":false},"notebookId":"65251b1ab0f4556a3142003a"},"source":"**正态模型介绍**  \n\n假设 Y 是一个连续随机变量，可以取 -∞ 和 ∞ 之间的任意值，即 Y∈ (-∞, ∞)。  \n\n那么，Y 的变异性可以很好地用均值参数 μ∈ (-∞, ∞) 和标准差参数 σ > 0 的正态模型来表示：  \n\n$$  \nY \\sim N(\\mu, \\sigma^2).  \n$$  \n\n正态模型的连续 pdf 形式:  \n\n$$  \n\\begin{equation}  \nf(y) = \\frac{1}{\\sqrt{2\\pi\\sigma^2}} \\exp\\bigg[{-\\frac{(y-\\mu)^2}{2\\sigma^2}}\\bigg] \\;\\; \\text{ for } y \\in (-\\infty,\\infty)  \n\\tag{5.11}  \n\\end{equation}  \n$$  \n\n正太模型的基本特征：  \n\n$$  \n\\begin{split}  \nE(Y) & = \\text{ Mode}(Y) = \\mu \\\\  \n\\text{Var}(Y) & = \\sigma^2 \\\\  \n\\text{SD}(Y) & = \\sigma. \\\\  \n\\end{split}  \n$$  \n\n> 此外，大家都知道的，大约 95% 的 Y 值都在 μ 的 2 个标准差范围内。"},{"cell_type":"code","metadata":{"jupyter":{},"collapsed":false,"scrolled":false,"tags":[],"slideshow":{"slide_type":"slide"},"id":"DACFED0C13884EA39316F073DFEA3ABD","notebookId":"65251b1ab0f4556a3142003a","trusted":true},"source":"import seaborn as sns\nimport matplotlib.pyplot as plt\n\n# 创建数据\nimport numpy as np\nnp.random.seed(0)\ndata1 = np.random.normal(loc=0, scale=1, size=1000)\ndata2 = np.random.normal(loc=5, scale=2, size=1000)\ndata3 = np.random.normal(loc=10, scale=5, size=1000)\n\n# 绘制图形\nfig, axes = plt.subplots(1, 3, figsize=(15, 5))\n\n# 绘制第一个图\nsns.histplot(data=data1, kde=True, ax=axes[0], stat = 'density')\naxes[0].set_title('Mean=0, Std=1')\naxes[0].set_ylim([0, 0.5])\n\n# 绘制第二个图\nsns.histplot(data=data2, kde=True, ax=axes[1], stat = 'density')\naxes[1].set_title('Mean=5, Std=2')\naxes[1].set_ylim([0, 0.5])\n\n# 绘制第三个图\nsns.histplot(data=data3, kde=True, ax=axes[2], stat = 'density')\naxes[2].set_title('Mean=10, Std=5')\naxes[2].set_ylim([0, 0.5])\n\n# 显示图形\nplt.tight_layout()\n# 移除图的上、右边框线\nsns.despine()","outputs":[{"output_type":"display_data","data":{"text/plain":"<Figure size 1500x500 with 3 Axes>","text/html":"<img src=\"https://cdn.kesci.com/upload/rt/F842A10623C94892A79EBCC2254CB572/s2326jew71.png\">"},"metadata":{}}],"execution_count":12},{"cell_type":"markdown","metadata":{"jupyter":{},"scrolled":false,"tags":[],"slideshow":{"slide_type":"slide"},"id":"685E88CE7DF147AC8B688BE5E3A5E711","runtime":{"status":"default","execution_status":null,"is_visible":false},"notebookId":"65251b1ab0f4556a3142003a"},"source":"上图展示了各种平均值和标准差参数值 μ 和 σ 下的正态模型。  \n\n- 无论参数如何变化，正态模型都呈钟形，并围绕 μ 对称  \n- 因此，当 μ 变大时，模型也会随之向右移动。  \n- 此外，σ 控制着正态模型的变异性--σ 越大，模型越分散。  \n- 最后，虽然正态变量 Y 的取值范围可以从-∞到∞，但如果 Y 值与均值 μ 的差值超过 3 个标准差 σ，则正态模型赋予 Y 值的可信度可以忽略不计。"},{"cell_type":"markdown","metadata":{"jupyter":{},"scrolled":false,"tags":[],"slideshow":{"slide_type":"slide"},"id":"7B4D10BDE5FF42B1BC819C6D89FC3CD2","runtime":{"status":"default","execution_status":null,"is_visible":false},"notebookId":"65251b1ab0f4556a3142003a"},"source":"**Normal data model**  \n\n回到我们的例子，我们假设收集了 n = 10000 名被试的身高（Y1, Y2, ... , Yn）  \n- 这些被试的身高显然是彼此独立的，  \n- 并且围绕平均身高 µ 的正态分布，标准偏差为 σ。  \n- 此外为了保持对 µ 的关注，我们将在整个分析过程中的标准偏差固定为 σ = 5 cm。3 σ 的范围表明，大多数人的身高在 150 cm 到 180 cm 之间。  \n- 因此，10000 名被试的身高的均值为 168cm，标准差为 5cm。 显然，相比于 2020 年的数据 165cm，现在的数据 168cm 体现了大众身高的增长。  \n\n接着我们可以定义出正态模型的似然函数：  \n\n$$  \nL(\\mu |\\vec{y}) \\propto \\prod_{i=1}^{n} \\exp\\bigg[{-\\frac{(y_i-\\mu)^2}{2\\sigma^2}}\\bigg] =  \\exp\\bigg[{-\\frac{\\sum_{i=1}^n(y_i-\\mu)^2}{2\\sigma^2}}\\bigg]  .  \n$$  \n\n"},{"cell_type":"code","metadata":{"jupyter":{},"collapsed":false,"scrolled":false,"tags":[],"slideshow":{"slide_type":"fragment"},"trusted":true,"id":"9989C239AE6844D787DF91469D5D5BEC","notebookId":"65251b1ab0f4556a3142003a"},"source":"# 模拟10000名被试身高的数据并绘图\n\n# 创建数据\nnp.random.seed(0)\ndata = np.random.normal(loc=168, scale=5, size=10000)\n\n# 绘图\nsns.histplot(data=data, kde=True, stat = 'density')\n\nplt.xlabel('Height (cm) for 10000 participants')\n# 显示图形\nplt.tight_layout()\n# 移除图的上、右边框线\nsns.despine()","outputs":[{"output_type":"display_data","data":{"text/plain":"<Figure size 640x480 with 1 Axes>","text/html":"<img src=\"https://cdn.kesci.com/upload/rt/B4D57DB263DD4A039F6E101C3862D897/s2326kwjfd.png\">"},"metadata":{}}],"execution_count":13},{"cell_type":"markdown","metadata":{"jupyter":{},"scrolled":false,"tags":[],"slideshow":{"slide_type":"slide"},"id":"F8F28D92354346008848E0EB4ADB11E6","runtime":{"status":"default","execution_status":null,"is_visible":false},"notebookId":"65251b1ab0f4556a3142003a"},"source":"### Normal prior  \n\n根据2020年之前的数据，我们可以用 165cm 作为我们正态先验模型的均值，即 µ = 165。  \n\n具体来说，我们假设 μ 本身是围绕某个均值 θ 和标准差 τ 的正态分布 (其中， θ 和 τ是超参)：  \n\n$$  \n\\begin{align*}  \n\\mu & \\sim N(\\theta, \\tau^2) \\\\  \nf(\\mu) & = \\frac{1}{\\sqrt{2\\pi\\tau^2}} \\exp\\bigg[{-\\frac{(\\mu - \\theta)^2}{2\\tau^2}}\\bigg] \\;\\; \\text{ for } \\mu \\in (-\\infty,\\infty)  \n\\tag{5.14}  \n\\end{align*}  \n$$  \n\n注意👁️，正态先验假设 μ∈（-∞，∞）与我们对数据模型的假设一致，我们还将在后面证明这是一个共轭先验。因为两个模型都正比于该项：  \n\n$$  \n\\exp\\bigg[{-\\frac{(\\mu - \\blacksquare)^2}{2\\blacksquare^2}}\\bigg]  \n$$  \n\n> 先验模型和数据模型的差异仅表现为均值的差异，即先验模型的均值为 165cm，而数据模型的均值为 168cm。"},{"cell_type":"code","metadata":{"jupyter":{},"collapsed":false,"scrolled":false,"tags":[],"slideshow":{"slide_type":"fragment"},"trusted":true,"id":"832B32A8DCA042A6A0A78BA552079BB4","notebookId":"65251b1ab0f4556a3142003a"},"source":"# 绘制先验\n\n# 创建数据\nnp.random.seed(0)\ndata = np.random.normal(loc=165, scale=5, size=1000)\n\n# 绘图\nsns.histplot(data=data, kde=True, stat = 'density')\n\nplt.xlabel('Height (cm) of prior')\n# 显示图形\nplt.tight_layout()\n# 移除图的上、右边框线\nsns.despine()","outputs":[{"output_type":"display_data","data":{"text/plain":"<Figure size 640x480 with 1 Axes>","text/html":"<img src=\"https://cdn.kesci.com/upload/rt/570F27F402E949DBA2EA527D5409BED0/s2326kzk4w.png\">"},"metadata":{}}],"execution_count":14},{"cell_type":"markdown","metadata":{"jupyter":{},"scrolled":false,"tags":[],"slideshow":{"slide_type":"slide"},"id":"91CFE79150FD49F4800F00CB7962C1CD","runtime":{"status":"default","execution_status":null,"is_visible":false},"notebookId":"65251b1ab0f4556a3142003a"},"source":"### Normal-Normal conjugacy  \n\n为了得到 μ 的后验模型，我们必须将先验模型和数据信息结合起来。  \n\n> 需要强调的是，我们选择的正态先验模型属于正态-正态的共轭族！因此，μ 的后验模型也将是正态的，并根据先验数据和观测数据更新参数。  \n\n以下公式展示了μ的后验模型：  \n\n$$  \n\\begin{align*}  \nY_i | \\mu & \\stackrel{ind}{\\sim} N(\\mu, \\sigma^2) \\\\  \n\\mu & \\sim N(\\theta, \\tau^2) \\\\  \n\\mu|\\vec{y} \\; & \\sim \\;  N\\bigg(\\theta\\frac{\\sigma^2}{n\\tau^2+\\sigma^2} + \\bar{y}\\frac{n\\tau^2}{n\\tau^2+\\sigma^2}, \\; \\frac{\\tau^2\\sigma^2}{n\\tau^2+\\sigma^2}\\bigg)  \n\\tag{5.15}  \n\\end{align*}  \n$$  \n\n首先，后验均值是先验均值 E(μ) = θ 和样本均值 y 的加权平均值；  \n\n$$  \n\\text{posterior mean} \\sim \\theta\\frac{\\sigma^2}{n\\tau^2+\\sigma^2} + \\bar{y}\\frac{n\\tau^2}{n\\tau^2+\\sigma^2}  \n$$  \n\n其次，后验方差受先验变异性 τ 和数据变异性 σ 的影响：  \n\n$$  \n\\text{posterior variance}~\\frac{\\tau^2\\sigma^2}{n\\tau^2+\\sigma^2}  \n$$  \n\n两者都受到样本量n的影响。  \n- 首先，随着n的增加，后验均值对先验均值的权重减少，对样本均值y的权重增加: $\\frac{\\sigma^2}{n\\tau^2+\\sigma^2} \\to 0 \\;\\; \\text{ and } \\;\\;\\frac{n\\tau^2}{n\\tau^2+\\sigma^2} \\to 1 .$  \n- 此外，随着 n 的增大，后验方差会减小 $\\frac{\\tau^2\\sigma^2}{n\\tau^2+\\sigma^2} \\to 0$  \n- 也就是说，我们掌握的数据越多，我们对 μ 的后验确定性就越高，也就越与数据的结果相似。"},{"cell_type":"markdown","metadata":{"jupyter":{},"scrolled":false,"tags":[],"slideshow":{"slide_type":"slide"},"id":"1C261AE222894E79AC078DD66BB96E13","runtime":{"status":"default","execution_status":null,"is_visible":false},"notebookId":"65251b1ab0f4556a3142003a"},"source":"结合之前的先验模型和数据模型，现在我们可以来计算后验并绘制它。  \n\n- 先验模型假设全国成人的平均身高为 165cm，标准偏差为 5cm。  \n- 数据模型为 10000 名被试的身高数据，平均身高为 168cm，标准偏差为 5cm。"},{"cell_type":"code","metadata":{"jupyter":{},"collapsed":false,"scrolled":false,"tags":[],"slideshow":{"slide_type":"slide"},"id":"3FBE3B9404E1448AA357D44CC1938488","notebookId":"65251b1ab0f4556a3142003a","trusted":true},"source":"# 定义身高范围\nx = np.linspace(150, 200, 10000)\n\n# 定义先验分布\nprior_mean = 165\nprior_std = 5\nprior_y = st.norm.pdf(x, loc = prior_mean, scale = prior_std) / np.sum(st.norm.pdf(x, prior_mean, prior_std))\n\n# 生成似然\nlikelihood_mean = 168\nlikelihood_std = 5\nlikelihood_values = st.norm.pdf(x, loc = likelihood_mean, scale = likelihood_std) / np.sum(st.norm.pdf(x, likelihood_mean, likelihood_std))\n\n# 计算后验分布\nposterior_mean = (prior_mean * prior_std**2 + likelihood_mean * likelihood_std**2) / (prior_std**2 + likelihood_std**2)\nposterior_std = np.sqrt((prior_std**2 * likelihood_std**2) / (prior_std**2 + likelihood_std**2))\nposterior = st.norm.pdf(x, loc = posterior_mean, scale = posterior_std) / np.sum(st.norm.pdf(x, posterior_mean, posterior_std))\n\n\nplt.plot(x, prior_y, color='#f0e442', label=\"prior\")\nplt.fill_between(x, prior_y, color=\"#f0e442\", alpha=0.5)\nplt.plot(x, likelihood_values, color='#0071b2', label=\"likelihood\")\nplt.fill_between(x, likelihood_values, color=\"#0071b2\", alpha=0.5)\nplt.plot(x, posterior, color='#009e74', label=\"posterior\")\nplt.fill_between(x, posterior, color=\"#009e74\", alpha=0.5)\n\n# 设置 x 和 y 轴标签\nplt.xlabel('$\\mu$ for height')\nplt.ylabel('density')\nplt.legend()\n\n# 移除图的上、右边框线\nsns.despine()","outputs":[{"output_type":"display_data","data":{"text/plain":"<Figure size 640x480 with 1 Axes>","text/html":"<img src=\"https://cdn.kesci.com/upload/rt/61DB0475CDD549A2B738DD8AD4518234/s233jeqkw0.png\">"},"metadata":{}}],"execution_count":25},{"cell_type":"code","metadata":{"jupyter":{},"collapsed":false,"scrolled":false,"tags":[],"slideshow":{"slide_type":"slide"},"id":"BD4C13C0503C42DC8C6E5AE75CD6DF42","notebookId":"65251b1ab0f4556a3142003a","trusted":true},"source":"print(f\"后验分布的均值：{posterior_mean}。 介于先验和似然之间。\")","outputs":[{"output_type":"stream","name":"stdout","text":"后验分布的均值：166.5。 介于先验和似然之间。\n"}],"execution_count":26},{"cell_type":"markdown","metadata":{"jupyter":{},"scrolled":false,"tags":[],"slideshow":{"slide_type":"slide"},"id":"263381EC101D4ECA828C521F6CAE96A7","runtime":{"status":"default","execution_status":null,"is_visible":false},"notebookId":"65251b1ab0f4556a3142003a"},"source":"**扩展阅读：证明 Normal-Normal conjugacy**  \n\n为完整起见，我们在此证明正态-正态模型产生后验模型。如果你不喜欢推导，也没关系。请随意跳到下一节。  \n\n让我们直接进入正题。μ 的后验 pdf 与正态先验 pdf 和似然函数 的乘积成正比。对于 μ∈ (-∞, ∞)：  \n$$  \nf(\\mu|\\vec{y}) \\propto f(\\mu)L(\\mu|\\vec{y}) \\propto \\exp\\bigg[{\\frac{-(\\mu - \\theta)^2}{2\\tau^2}}\\bigg] \\cdot \\exp\\bigg[{-\\frac{(\\bar{y}-\\mu)^2}{2\\sigma^2/n}}\\bigg]  .  \n$$  \n\n接下来，我们可以展开指数中的平方，包括第一个指数分子中的$\\theta^2$ 和第二个指数分子中的 $y^2$：  \n$$  \n\\begin{split}  \nf(\\mu|\\vec{y})  \n& \\propto  \\exp\\Bigg[{\\frac{-\\mu^2+2\\mu\\theta-\\theta^2}{2\\tau^2}}\\Bigg]\\exp\\Bigg[{\\frac{-\\mu^2+2\\mu\\bar{y}-\\bar{y}^2}{2\\sigma^2/n}}\\Bigg] \\\\  \n& \\propto  \\exp\\Bigg[{\\frac{-\\mu^2+2\\mu\\theta}{2\\tau^2}}\\Bigg]\\exp\\Bigg[{\\frac{-\\mu^2+2\\mu\\bar{y}}{2\\sigma^2/n}}\\Bigg]. \\\\  \n\\end{split}  \n$$  \n\n我们给出指数的共同分母，并将它们合并成一个指数：  \n$$  \n\\begin{split}  \nf(\\mu|\\vec{y})  \n& \\propto  \\exp\\Bigg[{\\frac{(-\\mu^2+2\\mu\\theta)\\sigma^2/n}{2\\tau^2\\sigma^2/n}}\\Bigg]\\exp\\Bigg[{\\frac{(-\\mu^2+2\\mu\\bar{y})\\tau^2}{2\\tau^2\\sigma^2/n}}\\Bigg] \\\\  \n& \\propto  \\exp\\Bigg[{\\frac{(-\\mu^2+2\\mu\\theta)\\sigma^2 +(-\\mu^2+2\\mu\\bar{y})n\\tau^2}{2\\tau^2\\sigma^2}}\\Bigg]. \\\\  \n\\end{split}  \n$$  \n\n现在，让我们把 μ 项合并起来，重新排列，这样 $\\mu^2$ 就是：  \n$$  \n\\begin{split}  \nf(\\mu|\\vec{y})  \n& \\propto  \\exp\\Bigg[{\\frac{-\\mu^2(n\\tau^2+\\sigma^2)+2\\mu(\\theta\\sigma^2+ \\bar{y}n\\tau^2) }{2\\tau^2\\sigma^2}}\\Bigg] \\\\  \n& \\propto  \\exp\\Bigg[{\\frac{-\\mu^2+2\\mu\\left(\\frac{\\theta\\sigma^2 + \\bar{y}n\\tau^2}{n\\tau^2+\\sigma^2}\\right) }{2(\\tau^2\\sigma^2) /(n\\tau^2+\\sigma^2)}}\\Bigg]. \\\\  \n\\end{split}  \n$$  \n\n仔细观察，你会发现我们可以带回一些不依赖于 μ 的常数来完成分子中的平方：  \n$$  \n\\begin{split}  \nf(\\mu|\\vec{y})  \n& \\propto  \\exp\\Bigg[{\\frac{-\\bigg(\\mu - \\frac{\\theta\\sigma^2 + \\bar{y}n\\tau^2}{n\\tau^2+\\sigma^2}\\bigg)^2 }{2(\\tau^2\\sigma^2) /(n\\tau^2+\\sigma^2)}}\\Bigg]. \\\\  \n\\end{split}  \n$$  \n\n这看起来仍然很混乱，但是一旦我们完成了正方形，我们实际上就得到了 μ 的正态 pdf 内核，即 exp部分。通过确定缺失的部分 ∎，我们可以得出以下结论  \n$$  \n\\mu|\\vec{y} \\;  \\sim  \\; N\\left(\\frac{\\theta\\sigma^2+ \\bar{y}n\\tau^2}{n\\tau^2+\\sigma^2}, \\;{\\frac{\\tau^2\\sigma^2}{n\\tau^2+\\sigma^2}} \\right)  \n$$  \n\n我们可以将后验均值重组为先验均值 μ 和数据均值 y 的加权平均值：  \n$$  \n\\frac{\\theta\\sigma^2+ \\bar{y}n\\tau^2}{n\\tau^2+\\sigma^2} = \\theta\\frac{\\sigma^2}{n\\tau^2+\\sigma^2} + \\bar{y}\\frac{n\\tau^2}{n\\tau^2+\\sigma^2} .  \n$$  \n\n"},{"cell_type":"markdown","metadata":{"jupyter":{},"scrolled":false,"tags":[],"slideshow":{"slide_type":"slide"},"id":"53D9D311257748CE862CCB95889B56D6","runtime":{"status":"default","execution_status":null,"is_visible":false},"notebookId":"65251b1ab0f4556a3142003a"},"source":"**Critiques of conjugate family models**  \n\n最后，我们补充一下共轭族模型的**缺点**  \n\n1. 共轭先验模型可能并不能适应你的先验信念。  \n  - 例如，正态模型总是围绕均值 μ 对称。因此，如果你的先验认识不是对称的，那么正态先验模型可能就不适合作为先验。  \n2. 共轭族模型并不允许有一个完全平坦的先验(uniform prior)。  \n  - 虽然我们可以通过设置 α = β = 1 来使得 Beta 先验变得更加平坦，但无论是 Normal 还是 Gamma 先验（或任何具有无限支持的适当模型）都**无法调整为完全平坦**。  \n- 我们能做的最好的办法就是调整先验，使其具有非常高的方差，这样它们就几乎是平的了。"},{"cell_type":"markdown","metadata":{"jupyter":{},"scrolled":false,"tags":[],"slideshow":{"slide_type":"slide"},"id":"92FA9F4DF3D44B819F47CB20648AAD23","runtime":{"status":"default","execution_status":null,"is_visible":false},"notebookId":"65251b1ab0f4556a3142003a"},"source":"**练习**  \n\n在先前的示例中，我们将身高的标准差固定为5，这显然不符实实时。  \n\n在接下来的练习中，你可以尝试将标准差设置为不同的值，并观察结果的变化。  \n\n你练习的目标：  \n- 如何调整似然，使得后验均值接近更先验的均值？  \n- 如何调整似然，使得后验均值更接近后验的均值？"},{"cell_type":"code","metadata":{"jupyter":{},"collapsed":false,"scrolled":false,"tags":[],"slideshow":{"slide_type":"slide"},"id":"42D89B281B0A45249D050C0BC2E3A751","notebookId":"65251b1ab0f4556a3142003a","trusted":true},"source":"# 定义身高范围\nx = np.linspace(150, 200, 10000)\n\n# 定义先验分布\nprior_mean = 165\nprior_std = 5\n\n# 生成似然\n#===========================================================================\n#                            请调整似然，观察不同似然参数对于先验的影响。\n#                            请修改 ... 中的值。\n#===========================================================================\nlikelihood_mean = ...\nlikelihood_std = ...\nlikelihood_values = st.norm.pdf(x, loc = likelihood_mean, scale = likelihood_std) / np.sum(st.norm.pdf(x, likelihood_mean, likelihood_std))\n\n#===========================================================================\n#                            进阶：你可以尝试修改先验为不同分布，体验非共轭先验带来的影响 \n#                            例如，将 norm 修改为 gamma，并修改对应的参数。(这里不做任何修改也可以运行)\n#===========================================================================\nprior_y = st.norm.pdf(x, loc = prior_mean, scale = prior_std) / np.sum(st.norm.pdf(x, prior_mean, prior_std))\n\n# 计算后验分布\nposterior_mean = (prior_mean * prior_std**2 + likelihood_mean * likelihood_std**2) / (prior_std**2 + likelihood_std**2)\nposterior_std = np.sqrt((prior_std**2 * likelihood_std**2) / (prior_std**2 + likelihood_std**2))\nposterior = st.norm.pdf(x, loc = posterior_mean, scale = posterior_std) / np.sum(st.norm.pdf(x, posterior_mean, posterior_std))\n\n\nplt.plot(x, prior_y, color='#f0e442', label=\"prior\")\nplt.fill_between(x, prior_y, color=\"#f0e442\", alpha=0.5)\nplt.plot(x, likelihood_values, color='#0071b2', label=\"likelihood\")\nplt.fill_between(x, likelihood_values, color=\"#0071b2\", alpha=0.5)\nplt.plot(x, posterior, color='#009e74', label=\"posterior\")\nplt.fill_between(x, posterior, color=\"#009e74\", alpha=0.5)\n\n# 设置 x 和 y 轴标签\nplt.xlabel('$\\mu$ for height')\nplt.ylabel('density')\nplt.legend()\n\n# 移除图的上、右边框线\nsns.despine()","outputs":[],"execution_count":null}],"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python","nbconvert_exporter":"python","file_extension":".py","version":"3.5.2","pygments_lexer":"ipython3"}},"nbformat":4,"nbformat_minor":2}